﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using testy;
using System.Windows.Forms;

namespace pytator {
	/// <summary>
	/// obsługa testu - do formy uciekamy wtedy, gdy jest to niezbędne
	/// </summary>
	class Pytator {
		public static string TestMode { get { return "test"; } }
		public static string NaukaMode { get { return "nauka"; } }
		private Test t;
		private CheckedTest ct; 
		private string mode;
		private QuestionsControl questionsControl;
		private SummaryControl summaryControl;
		public delegate void del ();
		public event del summaryRequest;
		public event del startRequest;
		public SummaryControl SummaryControl {
			get { return this.summaryControl; }
			set {
				this.summaryControl = value;
				this.gotSummaryControl();
			}
		}
		public Pytator(string path, QuestionsControl qc, string mode = "test") {
			if(mode == Pytator.TestMode || mode == Pytator.NaukaMode) {
				this.mode = mode;
			} else {
				throw new PytatorException("Musisz wybrać tryb testu");
			}
			try {
				t = new Test(path);
				this.createCheckedTest();
			} catch(XmlReadException e) {
				throw new PytatorException(e.Message);
			}
			this.questionsControl = qc; //ładowanie kontrolki pytania
			this.questionsControl.loadQuestionsList(this.t.Questions.Count); //załadowanie ilości pytań do kontrolki
			this.questionsControl.questionSelected += this.questionsControl_questionChanged; //obsługa zmiany pytania
			this.questionsControl.answersUpdate += this.questionsControl_anwersUpdate; //obsługa zmiany odpowiedzi
			this.questionsControl.testEnd += this.questionsControl_testEnd; //obsługa zakończenia testu
			this.questionsControl.loadQuestion(ct.Questions[0]); //załadowanie pierwszego pytania
			if(this.t.Time > 0) { //jeżeli jest ustawiony timer, to włączamy odliczanie
				this.questionsControl.loadTimer((int)this.t.Time);
			}
		}
		private void questionsControl_questionChanged(int i) {//załadowanie pytania do kontrolki
			this.questionsControl.loadQuestion(ct.Questions[i]);
		}
		private void questionsControl_anwersUpdate(int i, List<bool> anss) {//zapisanie zmienionych odpowiedzi do testu
			for(int k=0; k<ct.Questions[i].Answers.Count; k++) {
				ct.Questions[i].Answers[k].IsChecked = anss[k];
			}
		}
		private void questionsControl_testEnd() {//zakończenie testu
			if(this.mode == Pytator.NaukaMode) {
				ct.getTestWithUnproperAnswers(); //wyświetlenie pytań z błędnymi odpowiedziami
				if(ct.Questions.Count == 0) {
					MessageBox.Show("Już na wszystkie pytania odpowiedziałeś prawidłowo.");
					this.startRequest();
					return;
				}
				this.questionsControl.loadQuestionsList(ct.Questions.Count);
				this.questionsControl.loadQuestion(this.ct.Questions[0]);
			} else {
				this.summaryRequest(); //żądanie kontrolki podsumowującej
			}
		}
		private void createCheckedTest() { //na podstawie testu t tworzymy test, w którym możemy zaznaczać odpowiedzi (ct)
			List<CheckedQuestion> cQuestions = new List<CheckedQuestion>();
			for(int i=0; i<t.Questions.Count; i++) {
				List<CheckedAnswer> cAnswers = new List<CheckedAnswer>();
				for(int k=0; k<t.Questions[i].Answers.Count; k++) { 
					cAnswers.Add(new CheckedAnswer(t.Questions[i].Answers[k], false));
				}
				cQuestions.Add(new CheckedQuestion(t.Questions[i], cAnswers));
			}
			this.ct = new CheckedTest(t, cQuestions);
		}
		private void gotSummaryControl() { //jeżeli dostaliśmy kontrolkę podsumowującą to wyliczamy punkty i wrzucamy je na kontrolkę
			this.summaryControl.MaxPoints = this.ct.MaxPoints;
			this.summaryControl.Points = this.ct.Points();
		}
	}
}
